// 建立 到mongoDB 的连接
const mongoose = require('mongoose');
// mongoose.connect('mongodb://localhost:27017/testmgdb', {
mongoose.connect('mongodb://localhost:27017/test', {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    autoIndex: false
});
const conn = mongoose.connection;
// 用流 的一个方式监听；
conn.on('error', function(error) {
    console.log('数据库连接失败：' + error);
});
conn.once('open', function() {
    console.log('数据库连接成功');
});

//定义模式
const userSchema = new mongoose.Schema({ // 说明集合中要存储的字段，字段类型
    name: String,
    sex: String,
    age: Number

});

//创建模型
let User = mongoose.model('User', userSchema);

//文档的增加
// 方法一：创建对象，通过模型创建对象（文档），调用文档的save方法保存到数据库中
let u = new User({ name: '小向', sex: '男', age: 18 });
// 保存文档
u.save((err, product) => {
    if (!err) { // 保存文档成功
        console.log('保存文档成功', product)
    }
})

// 方法二：利用模型的create方法增加文档。
// 1 插入一条数据
User.create({
        name: '小玉',
        sex: '女',
        age: 18
    }, (err, result) => { // 返回错误信息，和结果
        if (!err) {
            console.log("插入成功", result);
        }
    })
    // 2 插入多条数据
User.create([{
    name: '小不点',
    sex: '男',
    age: 18
}, {
    name: '小不',
    sex: '男',
    age: 18
}], (err, result) => { // 返回错误信息，和结果
    if (!err) {
        console.log("插入成功", result);
    }
})


// 文档的修改
// 使用update方法 接收三个参数：更新条件，更新后的内容，额外配置）
// 这个只能更新一条数据；
// 将小向 的age改为20
User.update({ name: '小向' }, { $set: { age: 20 } }, (err, docs) => {
    if (!err) {
        console.log("更新成功");
    }
})

// 将所有小向的age改为22
User.update({ name: '小向' }, { $set: { age: 22 } }, { multi: true }, (err, docs) => {
    if (!err) {
        console.log("更新成功");
    }
})

// // 3 除了使用回调函数监听更新成功，还可以使用promise
// (async() => {
//     let resultSearch = await User.update({ name: '小不' }, { $set: { age: 25 } }, { multi: true });
//     console.log(resultSearch)
// })();



// 文档的查询
// 使用find方法 接收三个参数：过滤条件，返回结果的投影条件，回调函数（回调函数接收err，查询到的文档）
User.find({}, {}, (err, docs) => {
    if (!err) {
        console.log(docs);
    }
})